package taquin;

public class Taquin {

	int contenu[][]=new int[3][3];
	String etape;
	int heureustique;
	int cout;
	
	public Taquin(){
		contenu[0][0]=1;
		contenu[0][1]=4;
		contenu[0][2]=2;
		contenu[1][0]=3;
		contenu[1][1]=0;
		contenu[1][2]=5;
		contenu[2][0]=6;
		contenu[2][1]=7;
		contenu[2][2]=8;
		heureustique=0;
		cout=0;
		etape="0";
		}
	
	public Taquin(int i0,int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,String etp,int heureustique){
		contenu[0][0]=i0; 
		contenu[0][1]=i1;
		contenu[0][2]=i2;
		contenu[1][0]=i3;
		contenu[1][1]=i4;
		contenu[1][2]=i5;
		contenu[2][0]=i6;
		contenu[2][1]=i7;
		contenu[2][2]=i8;
		int n=0;
		if(contenu[0][0]!=0)n=n+1;
		if(contenu[0][1]!=1)n=n+1;
		if(contenu[0][2]!=1)n=n+1;
		if(contenu[1][0]!=3)n=n+1;
		if(contenu[1][1]!=4)n=n+1;
		if(contenu[1][2]!=5)n=n+1;
		if(contenu[2][0]!=6)n=n+1;
		if(contenu[2][1]!=7)n=n+1;
		if(contenu[2][2]!=8)n=n+1;

		this.heureustique= n;
		etape=etp;
		cout=etape.length()-1;}
	
	int giveIofZero(Taquin t){
		if(contenu[0][0]==0)return 0; else
		if(contenu[0][1]==0)return 0; else
		if(contenu[0][2]==0)return 0; else
		if(contenu[1][0]==0)return 1; else
		if(contenu[1][1]==0)return 1; else
		if(contenu[1][2]==0)return 1; else
		if(contenu[2][0]==0)return 2; else
		if(contenu[2][1]==0)return 2; else
		 return 2;
	}
	
	int giveJofZero(Taquin t){
		if(contenu[0][0]==0)return 0; else
		if(contenu[0][1]==0)return 1; else
		if(contenu[0][2]==0)return 2; else
		if(contenu[1][0]==0)return 0; else
		if(contenu[1][1]==0)return 1; else
		if(contenu[1][2]==0)return 2; else
		if(contenu[2][0]==0)return 0; else
		if(contenu[2][1]==0)return 1; else
		 return 2;
	}
	
	//verification du resultat desiree
	boolean isCorrect(){
		if(contenu[0][0]!=0)return false; else 
		if(contenu[0][1]!=1)return false; else
		if(contenu[0][2]!=2)return false; else
		if(contenu[1][0]!=3)return false; else
		if(contenu[1][1]!=4)return false; else
		if(contenu[1][2]!=5)return false; else
		if(contenu[2][0]!=6)return false; else
		if(contenu[2][1]!=7)return false; else
		if(contenu[2][2]!=8)return false; else
		return true;
	}
	
	Taquin copie()
	{
		Taquin t1=new Taquin(contenu[0][0],contenu[0][01],contenu[0][02],contenu[01][0],contenu[01][01],contenu[01][02],contenu[02][0],contenu[02][01],contenu[2][2],etape,heureustique);
	return t1;
	}

	int compare(Taquin t2){
		    if(contenu[0][0]!=t2.contenu[0][0])return 0; else
			if(contenu[0][1]!=t2.contenu[0][1])return 0; else
			if(contenu[0][2]!=t2.contenu[0][2])return 0; else
			if(contenu[1][0]!=t2.contenu[1][0])return 0; else
			if(contenu[1][1]!=t2.contenu[1][1])return 0; else
			if(contenu[1][2]!=t2.contenu[1][2])return 0; else
			if(contenu[2][0]!=t2.contenu[2][0])return 0; else
			if(contenu[2][1]!=t2.contenu[2][1])return 0; else
		    if(contenu[2][2]!=t2.contenu[2][2])return 0; else

			 return 1;
	}

	void afiicher(){
		for(int i=0;i<3;i++){
			   System.out.println(""+contenu[i][0]+""+contenu[i][1]+""+contenu[i][2]);
		   }
	}
	
	//deplacement vers la droite
	Taquin deplacerDroite() throws CloneNotSupportedException{

		Taquin t=copie();
		if(t.giveJofZero(t)==0)
			return null;
		else{
			     int i=t.giveIofZero(t);
			     int j=t.giveJofZero(t);
			     t.contenu[i][j]=t.contenu[i][j-1];
                 t.contenu[i][j-1]=0;
                 t.etape=t.etape+"d";

                 return t ;}
		 
		}
	
	//deplacement versla gauche
	Taquin deplacerGauche() throws CloneNotSupportedException{
		
		Taquin t=copie();
		if(t.giveJofZero(t)==2)
			return null;
		else{     int i=t.giveIofZero(t);
	              int j=t.giveJofZero(t);
			     t.contenu[i][j]=t.contenu[i][j+1];
                 t.contenu[i][j+1]=0;
                 t.etape=t.etape+"g";
                 return t ;}
		  
		 
		}
	
	//deplacement en haut
	Taquin deplacerHaut(){
		 Taquin t=copie();
		 if(t.giveIofZero(t)==2)
				return null;
		 else{   
			 int i=t.giveIofZero(t);
             int j=t.giveJofZero(t);
			     t.contenu[i][j]=t.contenu[i+1][j];
                 t.contenu[i+1][j]=0;
                 t.etape=t.etape+"h";

                 return t ;}
		 
		}
	
	//deplacement en Bas
	Taquin deplacerBas() throws CloneNotSupportedException{
		Taquin t=copie();
		
		if(t.giveIofZero(t)==0)
			return null;
		else {   int i=t.giveIofZero(t);
                 int j=t.giveJofZero(t);
		 	     t.contenu[i][j]=t.contenu[i-1][j];
                 t.contenu[i-1][j]=0;
                 t.etape=t.etape+"b";

                 return t ;}
		 
		}

     public static void main(String arg[]) throws CloneNotSupportedException{
    	 Taquin t=new Taquin();
    	 int i=t.giveIofZero(t);
    	 int j=t.giveJofZero(t);
    	 t.afiicher();
    	 System.out.println("la position de 0 en ligne ="+i+"\n laposition de 0 en colonne ="+j);
    	 Taquin td=t.deplacerHaut();
    	 td.afiicher();
    	 
     }
}
